motoでDynamoDBをモックするときはmock_dynamodbを使用することになったので歴史を振り返ってみた
こんにちは。サービス開発室の武田です。
PythonのAWSライブラリといえばboto3ですね。boto3を使用することで、簡単にプログラムからAWSリソースを操作できます。外部APIを使用する際に課題となるのはユニットテストです。Pythonではmotoという、boto3のモッキングライブラリが開発されており、これを使用することでboto3を使用しているプログラムのテストが比較的容易に実行できます。
motoではデコレータを使用してモックを使用します。たとえばDynamoDBのモックを差し込みたい場合、次のように書きます。
@mock_dynamodb2 def test_dynamodb(): pass
さて、長らくmotoユーザーの間では、DynamoDBをモックするならmock_dynamodb2
を使用するのが常識でした。実はv4.0.0
でこのAPIは削除され、代わりにmock_dynamodb
を使用することになりました。結論としてはこれだけなのですが、このエントリでは、少しこのAPIの変遷について追ってみましょう。
そもそもdynamodbとdynamodb2とは
最新のmotoでは(正確にはv4.0.0
以降では)mock_dynamodb
というAPIを使用することになったわけですが、そもそもなぜ2種類もあったのでしょうか?
motoの初期実装ではmock_dynamodb
だけが存在し、mock_dynamodb2
が実装されたのは2014年のことです。
Dynamo v2 no indexes by creyer · Pull Request #69 · getmoto/moto
当時のAWS事情を知っている方はどれくらいいるでしょうか。実は2014年というのは boto3が登場する以前の話 です。
このころはまだbotoという(boto3とは違う)ライブラリが使われていました。そしてbotoでDynamoDBv2というAPIが実装されたようです。motoではこの新しいAPIに対応するため、従来のmock_dynamodb
とは別にmock_dynamodb2
を実装したという経緯のようです。
mock_dynamodb
が対応していたのは古いAPIのため、boto3でモックする場合はmock_dynamodb2
を使用するということになったのでしょう。
mock_dynamodb2は同一実装となり非推奨へ
前述のような経緯で、長らくmock_dynamodb2
を使用していましたが、次のPRでこれが非推奨となりました。
Deprecate mock_dynamodb2 by bblommers · Pull Request #4919 · getmoto/moto
v3.1.0
で取り込まれており、ポイントは次の3点です。
moto/dynamodb
ディレクトリがmoto/dynamodb_v20111205
にリネームされたmoto/dynamodb2
ディレクトリがmoto/dynamodb
にリネームされたmock_dynamodb
とmock_dynamodb2
は同一実装となった
つまり古いAPIはバージョン番号を付与した名前に変えてしまい、実質標準となっていたdynamodb2
をdynamodb
にしたというわけです。これによってmock_dynamodb2
は非推奨となりましたが、将来のバージョンで削除されるまでは、どちらを使っても同じ挙動をします。
mock_dynamodb2削除
その後、非推奨となっていたmock_dynamodb2
はv4.0.0
で削除されます。
Remove DynamoDB2/RDS2 decorators by bblommers · Pull Request #5383 · getmoto/moto
これによって、完全にmock_dynamodb2
は使用できなくなり、mock_dynamodb
を使用することになりました。
moto時系列まとめ
- 2013-02-16 first commit
- 2013-02-27 v0.0.3リリース(dynamodb実装)
- 2014-01-12 v0.2.16リリース(dynamodb2実装)
- 2015-06-23 boto3 GA
- 2017-05-13 moto GA
- 2022-03-13 v3.1.0リリース(dynamodb2非推奨)
- 2022-08-20 v4.0.0リリース(dynamodb2削除)
まとめ
motoでDynamoDBをモックする場合、バージョンによって使用するデコレーターが変わります。最新版を使用する際は、mock_dynamodb
を使用してください。